package com.tengju.user.infrastructure.persistence.mybatis.mapper.dealer.custom;

import com.idanchuang.support.mybatis.crypt.annotation.CryptField;
import com.tengju.user.domain.model.user.StarLevelEnum;
import com.tengju.user.domain.model.user.UserIdCode;
import com.tengju.user.infrastructure.persistence.mybatis.dataobject.UserInfoDO;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

public interface UserInfoDOCustomMapper {

    UserInfoDO selectByIdCode(@Param("idCode") Long idCode);

    void insertOrUpdateStarInfo(@Param("idCode") long idCode, @Param("starRole") Integer starRole, @Param("starLevel") Integer starLevel);

    List<UserInfoDO> batchGetUserInfoByIdCodes(@Param("idCodeList") List<Long> idCodeList);

    List<UserInfoDO> batchGetUserInfoByUserId(@Param("userIdList") List<Long> userIdList);

    List<Long> listIdCodeByStarLevel(@Param("starLevel") Integer starLevel, @Param("offset") int offset, @Param("limit") int limit);

    int countByStarLevel(@Param("starLevel") Integer starLevel);

    List<UserInfoDO> selectByMobileFuzzy(@Param("mobile") String mobile);

    UserInfoDO selectByMobile(@CryptField @Param("mobile") String mobile,@Param("originMobile") String originMobile);


    UserInfoDO selectByAreaCodeAndMobile(@Param("areaCode") String areaCode,@CryptField @Param("mobile") String mobile);

    long insert(UserInfoDO record);

    int updateUserInfo(UserInfoDO record);

    int updateMobile(@CryptField @Param("mobile") String mobile, @Param("userId") Long userId);

    int updateAreaCodeAndMobile(@Param("areaCode") String areaCode,@CryptField @Param("mobile") String mobile,@Param("userId") Long userId);

    UserInfoDO selectByUserId(@Param("userId") Long userId);

    int updateProtoInfo(UserInfoDO record);

    int updateNickname(Long userId, String nickname, LocalDateTime updateTime);

    int updateRealName(@Param("idCode") Long idCode, @Param("realName") String realName);

    int updateHeadImage(Long userId, String headImage, LocalDateTime updateTime);

    List<UserInfoDO> listAllStarUser();

    List<UserInfoDO> getAll();

    void deleteByUserId(Long userId);

    List<UserInfoDO> listByStarLevel(@Param("starLevel") Integer starLevel, @Param("offset") Integer offset, @Param("limit") Integer limit);

    List<UserInfoDO> queryByStarLevel(@Param("starLevels") List<Integer> starLevel);

    Integer countByStarLevels(@Param("starLevels") List<Integer> starLevel);

    List<UserInfoDO> batchQueryByForm(@Param("idCodes")List<UserIdCode> idCodes,@CryptField  @Param("mobile") String mobile, @Param("starLevel") StarLevelEnum starLevel,@Param("offset") Integer offset,@Param("limit") Integer limit);

    int countByForm(@Param("idCodes")List<UserIdCode> idCodes,@CryptField  @Param("mobile") String mobile, @Param("starLevel") StarLevelEnum starLevel,@Param("offset") Integer offset,@Param("limit") Integer limit);

    UserInfoDO getByUserIdCodeAndStarLevel(@Param("userIdCode") Long userIdCode,
                                           @Param("starLevel") Integer starLevel);
}